﻿#pragma once

#include <WinSock2.h>

#define MAX_CONTENT_LEN 1023                    // 一次发送的最大聊天内容长度
#define CONTENT_BUF_LEN (MAX_CONTENT_LEN + 1)   // 聊天内容缓存长度
#define DATE_TIME_BUF_LEN 20                    // 时间缓存长度
#define MAX_PASSWORD_LEN 4                      // 最大密码长度
#define MAX_USER_COUNT 50                       // 最大用户数
#define MAX_USERNAME_LEN 16                     // 最大用户名长度
#define MULTI_CHAT _T("群发消息")               // 群发消息标志
#define PASSWORD_BUF_LEN (MAX_PASSWORD_LEN + 1) // 密码缓存长度
#define SERVER_IP "192.168.1.112"               // 服务器 IP 地址
#define SERVER_PORT 5000                        // 服务器端口号
#define STRING_BUF_LEN 256                      // 字符串缓存长度
#define USERNAME_BUF_LEN (MAX_USERNAME_LEN + 1) // 用户名缓存长度

typedef struct UserInfo UserInfo;

// 结果码
typedef enum _ResultCode {
    ADD_FRIEND_ALLOW,               // "添加{0}为好友成功。"
    ADD_FRIEND_NOT_ALLOW,           // "拒绝和你成为好友。"
    ALREADY_BE_FRIENDS,             // "已经是你的好友了。"
    FRIEND_NAME_EQUAL_SELF_NAME,    // "好友名字与自己名字相同。"
    LOGON_SUCCEEDED,                // "登录成功。"
    NETWORK_ERROR,                  // "连接服务失败，请参考使用说明。"
    PASSWORD_WRONG,                 // "密码不正确。"
    REG_SUCCEEDED,                  // "注册成功。"
    SUCCEEDED,                      // ""
    TOO_MANY_FRIENDS,               // "朋友太多了，不能再继续添加了。"
    USER_ALREADY_LOGON,             // "该用户已经登录了。"
    USER_EXISTS,                    // "该用户名已经被注册了。"
    USER_NOT_FOUND                  // "该用户尚未注册。"
} ResultCode;

// 协议类型
typedef enum ProtocolType {
    ADD_FRIEND_REQUEST, // 添加好友请求
    ADD_FRIEND_RESULT,  // 添加好友结果
    CHAT,               // 聊天
    FRIEND_LOGON,       // 好友登录
    LOGOFF,             // 离线
    LOGON,              // 登录
    REG                 // 注册
} ProtocolType;

// 协议
typedef struct ImProtocol {
    ProtocolType mType; // 协议类型
} ImProtocol;

// 用户信息
typedef struct UserInfo {
    int mIconIndex;                     // 头像索引
    TCHAR mPassword[PASSWORD_BUF_LEN];  // 密码
    TCHAR mUsername[USERNAME_BUF_LEN];  // 用户名
} UserInfo;

// 添加好友请求
typedef struct AddFriendRequest {
    ProtocolType mType;                     // 协议类型
    TCHAR mDstUsername[USERNAME_BUF_LEN];   // 目标用户名
    int mSrcIconIndex;                      // 源用户头像索引
    TCHAR mSrcUsername[USERNAME_BUF_LEN];   // 源用户名

} AddFriendRequest;
AddFriendRequest* New_AddFriendRequest(LPCTSTR, int, LPCTSTR);

// 添加好友结果
typedef struct AddFriendResult {
    ProtocolType mType;                     // 协议类型
    int mDstIconIndex;                      // 目标用户头像索引
    TCHAR mDstUsername[USERNAME_BUF_LEN];   // 目标用户名
    ResultCode mResultCode;                 // 结果码
    TCHAR mSrcUsername[USERNAME_BUF_LEN];   // 源用户名

} AddFriendResult;
AddFriendResult* New_AddFriendResult(int, LPCTSTR, ResultCode, LPCTSTR);

// 聊天信息
typedef struct ChatInfo {
    ProtocolType mType;                     // 协议类型
    TCHAR mContent[CONTENT_BUF_LEN];        // 内容
    TCHAR mDstUsername[USERNAME_BUF_LEN];   // 目标用户名
    TCHAR mSrcUsername[USERNAME_BUF_LEN];   // 源用户名
    TCHAR mTime[DATE_TIME_BUF_LEN];         // 生成时间
} ChatInfo;
ChatInfo* New_ChatInfo(LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR);

// 好友登录通知
typedef struct FriendLogon {
    ProtocolType mType;                 // 协议类型
    TCHAR mUsername[USERNAME_BUF_LEN];  // 用户名
} FriendLogon;
FriendLogon* New_FriendLogon(LPCTSTR);

// 离线请求
typedef struct LogoffRequest {
    ProtocolType mType;                 // 协议类型
    TCHAR mUsername[USERNAME_BUF_LEN];  // 用户名
} LogoffRequest;
LogoffRequest* New_LogoffRequest(LPCTSTR);

// 登录请求
typedef struct LogonRequest {
    ProtocolType mType; // 协议类型
    UserInfo mUserInfo; // 用户信息
} LogonRequest;
LogonRequest* New_LogonRequest(LPCTSTR, LPCTSTR);

// 登录结果
typedef struct LogonResult {
    ProtocolType mType;                     // 协议类型
    int mFriendCount;                       // 好友数
    UserInfo mFriends[MAX_USER_COUNT];      // 好友列表
    BOOL mFriendsOnline[MAX_USER_COUNT];    // 好友在线状态列表
    int mIconIndex;                         // 头像索引
    ResultCode mResultCode;                 // 结果码

} LogonResult;
LogonResult* New_LogonResult();

// 注册请求
typedef struct RegRequest {
    ProtocolType mType; // 协议类型
    UserInfo mUserInfo; // 用户信息
} RegRequest;
RegRequest* New_RegRequest(int, LPCTSTR, LPCTSTR);

// 注册结果
typedef struct RegResult {
    ProtocolType mType;     // 协议类型
    ResultCode mResultCode; // 结果码
} RegResult;
RegResult* New_RegResult();
